#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-10-24 20:14
# @Author : youngchaolin

'''
pickle:
序列化：将python中所有的数据类型，转换成字节串
反序列化：将字节串转换为python数据类型
'''

import pickle

# 一般的数据类型，是可以的
res = pickle.dumps([1, 2, 3])
print(res, type(res))  # b'\x80\x03]q\x00(K\x01K\x02K\x03e.' <class 'bytes'>

l = pickle.loads(res)
print(l, type(l))

# 元组也可以
res = pickle.dumps(('name', 'age', 'salary'))
print(res, type(res))

t = pickle.loads(res)
print(t, type(t))

# set也可以
res = pickle.dumps(set({1, 2, 2, 2, 3}))
print(res, type(res))

s = pickle.loads(res)
print(s, type(s))

# 序列化到文件中，从文件中反序列化
with open('p.txt', mode='wb') as f:
    pickle.dump([1, 2, 3], f)
    print('pickle序列化到文件成功')

with open('p.txt', mode='rb') as f:
    # 上面dump一次，这里就load一次，可以多次dump和load
    res = pickle.load(f)
    print(res, type(res))

# 多次pickle数据到同一个文件中
# with open('w.txt',mode='ab') as f:
#     pickle.dump([1,2,3],f)
#     pickle.dump([4,5,6],f)
#     pickle.dump([7,8,9],f)
#     print('pickle序列化到文件成功')

# 多次从文件夹pickle数据
with open('w.txt',mode='rb') as f:
    res1=pickle.load(f)
    print(res1,type(res1))
    res2=pickle.load(f)
    print(res2,type(res2))
    res3=pickle.load(f)
    print(res3,type(res3))


'''
pickle常用场景：和json一样，一次性写入，一次性读取
'''

'''
json vs pickle
json：
1 不是所有数据都可以序列化，结果是字符串
2 不能多次对同一个文件进行序列化
3 json数据可以跨语言，java可以读，c也可以读取

pickle:
1 所有python类型都可以序列化，结果是字节串
2 可以多次对同一个文件序列化
3 只有python可以用，不能跨语言
'''